package tp1POO.Persistencia;

//Modelos
import java.util.List;
import java.util.Vector;

import tp1POO.GestorLog;
import tp1POO.Modelo.ObjetoPOO;

public class Persistencia {

	private Persistencia() {
		tipofabrica = FactoryType.Banco_de_Dados;
	}

	public boolean apagar(ObjetoPOO parObject)
	{
		try {
			escolheDAO(parObject);
			dao.apagar(parObject);
		}
		catch (Exception e) {
			e.printStackTrace();
			return false;	
		}
		finally {
			return true;
		}
	}
	
	public boolean salvar(ObjetoPOO parObject)
	{
		try {
			escolheDAO(parObject);
			dao.salvar(parObject);
		}
		catch (Exception e) {
			e.printStackTrace();
			return false;	
		}
		finally {
			return true;
		}
	}
	
	public boolean salvarVetor(ObjetoPOO[] objects)
	{
		if (objects != null && objects.length>0)
		{
			for (int i=0; i<objects.length; i++)
				salvar(objects[i]);
			return true;
		}
		else
			return false;
	}
	
	public ObjetoPOO encontrar(ObjetoPOO parObject)
	{
		ObjetoPOO obj = null;
		try {
			escolheDAO(parObject);
			obj = dao.encontrar(parObject);
		}
		catch (Exception e) {
			e.printStackTrace();
			return null;	
		}
		finally {
			return obj;
		}
	}
	
	public List<ObjetoPOO> listar(ObjetoPOO parTipo)
	{
		escolheDAO(parTipo);
		return dao.listar(parTipo);
	}

	public static Persistencia obterInstancia(){
		if (instance == null)
			instance = new Persistencia();
		return instance;
	}

	public void setFabrica (FactoryType parTipo) {
		if (parTipo != null) {
			tipofabrica = parTipo;
		}
	}
	
	private void escolheDAO (ObjetoPOO parObj) {
		AbstractFactoryDAO fabrica = null;
		if (tipofabrica == FactoryType.Banco_de_Dados)
			fabrica = new FactoryDAODB();
		else
			fabrica = new FactoryDAOTexto();
		
		if (fabrica != null)
			dao = fabrica.criarDAO(parObj);
	}
	
	//Vars
	private static Persistencia instance;
	private FactoryType tipofabrica;
	private DAO dao;
}
